Skip to content

一、为什么引入C语言if判断语句?

应用场景:

plain
// 应用场景:只有当按下按钮的时候,电脑才会显示电平的变化,否则就不会显示。这样就不会一直刷屏了
if (判断条件){
        业务逻辑执行
} else {
        否则:业务逻辑执行
}

C语言if判断语句的代码实现:

plain
#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#define button_pin_2 GPIO_NUM_2

void app_main(void)
{

    // 1,配置GPIO的模式
    gpio_set_direction(button_pin_2, GPIO_MODE_INPUT);
    // 2,配置成上拉输入
    gpio_set_pull_mode(button_pin_2, GPIO_PULLUP_ONLY);

    // 3,while 循环检测GPIO电平变化
    // 4,if检测到则printf
    while (1)
    {
        uint8_t input_level = gpio_get_level(button_pin_2);
        if (input_level == 0){
            printf("%d\n", input_level);
        }
        vTaskDelay(pdMS_TO_TICKS(500));
    }

}

二、单片机中的有哪些常用的数据类型?

ESP-IDF 中 “专属” 的固定宽度数据类型,核心是 ESP-IDF 基于 stdint.h(C99 标准)提供的固定宽度数据类型—— 这和 STM32 HAL 库的思路完全一致,目的是避免不同架构下原生类型长度不一致的问题。

ESP-IDF 中必须包含头文件 #include <stdint.h>(或间接包含,如 esp_err.h)才能使用这些类型,常用的有:

三、哪些是ESP-IDF 中数据类型的 “单片机专属用法”?

除了固定宽度类型,ESP-IDF 针对单片机场景还有几个实用的类型 / 注意点:

(1)什么是错误码类型 esp_err_t

这是 ESP-IDF 最核心的自定义类型,本质是 int32_t,用于表示函数执行结果:

plain
#include "esp_err.h" // 必须包含

// 示例:调用ESP-IDF API时判断返回值
esp_err_t ret = gpio_set_direction(GPIO_NUM_2, GPIO_MODE_OUTPUT);
if (ret != ESP_OK) { // ESP_OK 是 esp_err_t 类型的宏,值为0
    ESP_LOGE("GPIO", "设置GPIO方向失败,错误码:%d", ret);
}

(2)有哪些浮点类型的注意事项

ESP32 硬件支持硬件浮点运算(FPU),但 ESP-IDF 默认开启浮点支持,使用 float/double 时:

  • float 运算效率更高(硬件加速),double 是软件模拟(效率稍低);
  • 单片机中尽量避免频繁浮点运算,优先用整数运算(如把小数放大为整数,计算后再缩小)。

(3)有哪些位操作相关类型

操作寄存器 / 外设时,ESP-IDF 常用 uint32_t 表示寄存器值(因为 ESP32 外设寄存器多为 32 位),和 STM32 用 uint32_t 操作寄存器的用法完全一致:

plain
// 示例:直接操作GPIO寄存器(不推荐,仅演示类型用法)
uint32_t *gpio_out_reg = (uint32_t *)0x3FF44004; // GPIO_OUT_REG 地址
*gpio_out_reg |= (1 << 2); // 设置GPIO2输出高电平(uint32_t 位操作)

四、如何将轻触开关Button与LED灯结合?

4.1 流程:

  1. 配置 GPIO 口 有两个 GPIO 口需要配置:一个是 button(按键开关),将其 GPIO 模式设置为上拉输入;另一个是 LED 灯,直接设置为输出模式。
  2. 编写 while 循环
  3. 设置变量 定义一个变量来接收 button 的数值变化(即电平变化),调用 GPIO get level 函数获取状态。
  4. 编写判断语句 如果 button 被按下(电平等于 0),则给 LED 灯的引脚输出一个高电平,点亮 LED 灯;当 button 松开时,相应的 LED 灯随之熄灭。
  5. 使用延时函数 使用非阻塞的 vTaskDelay 函数,设置延时为 500ms。

ESP32-S3 与轻触开关、LED 灯fritzing接线图

ESP32-S3 与轻触开关、LED 灯实物面包板接线图

4.2 如何在 ESP-IDF 框架下把 Button 与 LED 灯结合编写代码?

4.2.1 代码实现:

plain
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"

#define button_pin_2 GPIO_NUM_2
#define led_pin_4    GPIO_NUM_4

void app_main(void)
{
    gpio_set_direction(button_pin_2, GPIO_MODE_INPUT);
    gpio_set_pull_mode(button_pin_2, GPIO_PULLUP_ONLY);

    gpio_set_direction(led_pin_4, GPIO_MODE_OUTPUT);

    while (1) 
    {

        uint8_t button_level = gpio_get_level(button_pin_2);

        if (button_level == 0) {
            gpio_set_level(led_pin_4, 1);
        } else {
            gpio_set_level(led_pin_4, 0);
        }

        vTaskDelay(pdMS_TO_TICKS(10));
    }

}

觉醒,然后燎原。 © 2026 门主引擎